"""
问题描述：
每次攻击 0.1 概率击晕，每次眩晕 2s，每秒攻击 3 次
1. 求连晕时间期望
2. 求连晕时间的概率分布（即连晕时间大于 t 秒的概率）
"""

# 对时间进行缩放，2s -> 6s，1/3s -> 1s
import random


def main():
    # 先随机测试一个概率期望分布
    test()
    return

    p = 0.1
    L = 6
    # 0 时刻到 6 时刻共 7 个元素
    mask = [1] * 7 + [0] * 30
    # range(L) 取值为 0、1、2、3、4、5
    # qs 中第 m 项（对应索引 m-1）是 p * (1-p)**(m-1)
    qs = [p * (1-p)**n for n in range(L)]
    # 索引 = 时刻，从第 7 个时刻开始，对应索引为 7
    for k in range(7, 37):
        # range(1, L+1) 取值为 1、2、3、4、5、6
        # qs 中第 n 个元素，对应索引为 n-1
        mask[k] = sum(mask[k-n] * qs[n-1] for n in range(1, L+1))

    # 格式化输出，不用管
    print(' '.join(map(lambda x: '%.3f' % x, mask)))

    # 运算
    # 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.469 0.415 0.362 0.309 0.256 0.203 0.150 0.125 0.103 0.083 0.067 0.053 0.043 0.035 0.028 0.023 0.018 0.015 0.012 0.010 0.008 0.006 0.005 0.004 0.003 0.003 0.002 0.002 0.001 0.001
    # 模拟
    # 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.470 0.417 0.363 0.310 0.256 0.204 0.150 0.125 0.102 0.083 0.067 0.054 0.043 0.035 0.028 0.023 0.018 0.015 0.012 0.010 0.008 0.006 0.005


def test():
    p = 0.1
    L = 6
    # 随机 N 个用例
    N = 100_000
    # rs 记录每个用例的结束时间
    rs = [L] * N
    # 总共演绎 M 代
    M = 30
    for t in range(M):
        for i, r in enumerate(rs):
            # 时间不满足条件，连晕已结束，时间不再增长
            if t > r: continue
            # 概率不满足条件，连晕时间不增长
            if random.random() > p: continue
            # 刷新时间
            rs[i] = t + L

    # 记录每个时间有多少个元素达成
    mask = [0] * (M+L)
    for r in rs:
        mask[r] += 1
    print(mask)
    # 转换成对应概率
    ps = [sum(mask[i:]) / N for i in range(M)]
    print(ps)
    print(' '.join(map(lambda x: '%.3f' % x, ps)))
    # 输出期望
    print(sum(n/3 * m/N for n, m in enumerate(mask)))


main()
